<!DOCTYPE html>
<html  lang="en" >
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, maximum-scale=5, viewport-fit=cover">
    <title>嵌入式系统学习笔记 | HulGodhel's Blog</title>
    <meta name="description" content="嵌入式系统 HulGodhel	于2020.06.07  第一章 嵌入式系统概论 无所不在的嵌入式系统 计算机将变的小巧玲珑，藏身于任何地方，又消失在任何地方;功能强大，无影无踪。 嵌入式系统举例 汽车控制系统。 嵌入式的展现形式  功能越来越复杂 硬件功能越来越复杂 软件编写工作量越来越大  因此，需要有一种新的驾驭硬件的软件编程规范。 举例：遥测和遥信 遥测（遥测信息）：远程测量。采集并传送运">
<meta property="og:type" content="article">
<meta property="og:title" content="嵌入式系统学习笔记">
<meta property="og:url" content="http://happylzyy.github.io/2020/06/07/embedded-system/index.html">
<meta property="og:site_name" content="HulGodhel&#39;s Blog">
<meta property="og:description" content="嵌入式系统 HulGodhel	于2020.06.07  第一章 嵌入式系统概论 无所不在的嵌入式系统 计算机将变的小巧玲珑，藏身于任何地方，又消失在任何地方;功能强大，无影无踪。 嵌入式系统举例 汽车控制系统。 嵌入式的展现形式  功能越来越复杂 硬件功能越来越复杂 软件编写工作量越来越大  因此，需要有一种新的驾驭硬件的软件编程规范。 举例：遥测和遥信 遥测（遥测信息）：远程测量。采集并传送运">
<meta property="og:locale" content="en_US">
<meta property="og:image" content="https://s1.ax1x.com/2020/06/08/tWmQG6.png">
<meta property="og:image" content="https://s1.ax1x.com/2020/06/08/tWmHeJ.png">
<meta property="og:image" content="https://s1.ax1x.com/2020/06/08/tWnAYt.png">
<meta property="og:image" content="https://s1.ax1x.com/2020/06/08/tWcbFJ.png">
<meta property="og:image" content="https://s1.ax1x.com/2020/06/08/tWguTg.png">
<meta property="og:image" content="https://s1.ax1x.com/2020/06/08/tWoFfO.png">
<meta property="og:image" content="https://s1.ax1x.com/2020/06/08/tWbkVA.png">
<meta property="og:image" content="https://s1.ax1x.com/2020/06/08/tWXwSx.png">
<meta property="og:image" content="https://s1.ax1x.com/2020/06/09/t4ik8S.png">
<meta property="og:image" content="https://s1.ax1x.com/2020/06/09/t4MYsP.png">
<meta property="article:published_time" content="2020-06-07T01:20:09.000Z">
<meta property="article:modified_time" content="2020-06-09T09:00:21.446Z">
<meta property="article:author" content="Zhaoyang Liu">
<meta property="article:tag" content="Embedded">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://s1.ax1x.com/2020/06/08/tWmQG6.png">

    
    <link rel="icon" href="/images/favicon.ico" type="image/x-icon">

    
<link rel="stylesheet" href="/css/common.min.css">



    
    
    
        <link href="//cdn.jsdelivr.net/npm/gitalk@1.4.0/dist/gitalk.min.css" rel="stylesheet">
    
    
        <link href="//cdn.jsdelivr.net/npm/lightgallery.js@1.1.3/dist/css/lightgallery.min.css" rel="stylesheet">
    
    
    
<link rel="stylesheet" href="/css/iconfont.min.css">

    
<meta name="generator" content="Hexo 4.2.1"></head>

    <body>
        <header class="header header-fixture">
    <div class="profile-search-wrap flex sm:block">
        
        
        <div class="profile sm:text-center md:px-1 lg:px-3 sm:pb-4 sm:pt-6">
            <a id="avatar" role="link" href="https://github.com/happylzyy" class="inline-block lg:w-16 lg:h-16 w-8 h-8 m-2" target="_blank" rel="noopener" rel="noreferrer" >
                <img src="https://www.gravatar.com/avatar/b92f7668d0c3b69074a6839e1167cbbb?s=128" class="rounded-full" alt="avatar">
            </a>
            <h2 id="name" class="hidden lg:block">Zhaoyang Liu</h2>
            <h3 id="title" class="hidden xl:block">Student &amp; Engineer</h3>
            
            <small id="location" class="hidden lg:block">
                <i class="iconfont icon-map-icon"></i>
                Qinhuangdao, China
            </small>
            
        </div>
        
        
<div class="search flex-1 flex lg:inline-block sm:hidden lg:px-4 lg:mt-2 lg:mb-4 lg:w-full">
    <form id="search-form" class="my-auto flex-1 lg:border lg:border-solid lg:border-gray-200">
        <div class="input-group table bg-gray-100 lg:bg-white w-full">
            <input id="search-input" type="text" placeholder="Search" class="inline-block w-full bg-gray-100 lg:bg-white">
            <span class="table-cell">
                <button name="search tigger button" disabled>
                    <i class="iconfont icon-search m-2"></i>
                </button>
            </span>
        </div>
    </form>
        
<script id="search-teamplate" type="text/html" data-path="/content.json">
    <div>
        <div class="search-header bg-gray-400">
            <input id="actual-search-input" model="keyword" ref="input" class="inline-block w-full h-10 px-2 py-1" placeholder="Search" type="text">
        </div>
        <div class="search-result bg-gray-200">
            {{#each searchPosts}}
            <a href="/{{ path }}" class="result-item block px-2 pb-3 mb-1 pt-1 hover:bg-indigo-100">
                <i class="iconfont icon-file"></i>
                <h1 class="result-title inline font-medium text-lg">{{ title }}</h1>
                <p class="result-content text-gray-600 text-sm">{{{ text }}}</p>
            </a>
            {{/each}}
        </div>
    </div>
</script>

</div>


        <button name="menu toogle button" id="menu-toggle-btn" class="block sm:hidden p-3" role="button" aria-expanded="false">
            <i class="iconfont icon-hamburger"></i>
        </button>
    </div>
    <nav id="menu-nav" class="hidden sm:flex flex-col">
        
        
            <div class="menu-item menu-home" role="menuitem">
                <a href="/.">
                    <i class="iconfont icon-home" aria-hidden="true"></i>
                    <span class="menu-title">Home</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-archives" role="menuitem">
                <a href="/archives">
                    <i class="iconfont icon-archive" aria-hidden="true"></i>
                    <span class="menu-title">Archives</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-categories" role="menuitem">
                <a href="/categories">
                    <i class="iconfont icon-folder" aria-hidden="true"></i>
                    <span class="menu-title">Categories</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-tags" role="menuitem">
                <a href="/tags">
                    <i class="iconfont icon-tag" aria-hidden="true"></i>
                    <span class="menu-title">Tags</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-repository" role="menuitem">
                <a href="/repository">
                    <i class="iconfont icon-project" aria-hidden="true"></i>
                    <span class="menu-title">Repository</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-about" role="menuitem">
                <a href="/about">
                    <i class="iconfont icon-cup" aria-hidden="true"></i>
                    <span class="menu-title">About</span>
                </a>
            </div>
        
        
<div class="social-links flex sm:flex-col lg:hidden mt-5">
    
        <span class="social-item text-center">
            <a href="https://github.com/happylzyy" target="_blank" rel="noopener">
                <i class="iconfont social-icon icon-github"></i>
                <span class="menu-title hidden lg:inline">menu.github</span>
            </a>
        </span>
    
        <span class="social-item text-center">
            <a href="https://twitter.com/hulgodhel" target="_blank" rel="noopener">
                <i class="iconfont social-icon icon-twitter"></i>
                <span class="menu-title hidden lg:inline">menu.twitter</span>
            </a>
        </span>
    
</div>


    </nav>
</header>

        <section class="main-section">
            
    <main class="flex-1 px-4 py-12 md:px-5 lg:px-8 lg:py-4 relative min-h-screen">
    

    <article class="content article article-archives article-type-list" itemscope="">
        <header class="article-header">
            
    
        <h1 class="article-title text-lg" itemprop="name">
            嵌入式系统学习笔记
        </h1>
    



            <p class="article-meta mb-3 text-xs">
                <span class="article-date">
    <i class="iconfont icon-calendar-check"></i>
	<a href="/2020/06/07/embedded-system/" class="article-date">
	  <time datetime="2020-06-07T01:20:09.000Z" itemprop="datePublished">Jun 7</time>
	</a>
</span>

                
    <span class="article-category">
    <i class="iconfont icon-folder"></i>
    <a class="article-category-link" href="/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F/">嵌入式系统</a>
  </span>


                
    <span class="article-tags">
    <i class="iconfont icon-tag"></i>
    <a class="article-tag-link" href="/tags/Embedded/" rel="tag">Embedded</a>
  </span>


                <span class="_partial/post-comment"><i class="icon icon-comment"></i>
                    <a href="/2020/06/07/embedded-system/#comments" class="article-comment-link">
                        Comments
                    </a>
                </span>
                
    
        <span class="post-wordcount" itemprop="wordCount">Word Count: 10.5k(words)</span>
    
    
        <span class="post-readcount" itemprop="timeRequired">Read Count: 36(minutes)</span>
    


            </p>
        </header>
        <div class="marked-body article-body">
            <h1 id="嵌入式系统">嵌入式系统</h1>
<p>HulGodhel	于2020.06.07</p>
<hr>
<h1 id="第一章-嵌入式系统概论">第一章 嵌入式系统概论</h1>
<h2 id="无所不在的嵌入式系统">无所不在的嵌入式系统</h2>
<p>计算机将变的小巧玲珑，藏身于任何地方，又消失在任何地方;功能强大，无影无踪。</p>
<h3 id="嵌入式系统举例">嵌入式系统举例</h3>
<p>汽车控制系统。</p>
<h3 id="嵌入式的展现形式">嵌入式的展现形式</h3>
<ul>
<li>功能越来越复杂</li>
<li>硬件功能越来越复杂</li>
<li>软件编写工作量越来越大</li>
</ul>
<p>因此，需要有一种新的驾驭硬件的软件编程规范。</p>
<h3 id="举例：遥测和遥信">举例：遥测和遥信</h3>
<p>遥测（遥测信息）：远程测量。采集并传送运行的参数。</p>
<p>遥信（遥信信息）：远程信号。采集并传送各种开关量信息。</p>
<h3 id="什么叫嵌入？">什么叫嵌入？</h3>
<p>原意：“紧紧地埋入、镶入”</p>
<p>狭义：宿主、寄主</p>
<h3 id="嵌入式系统的概念">嵌入式系统的概念</h3>
<ul>
<li>从技术的角度定义：以应用为中心，以计算机技术为基础，软件硬件可裁剪，适应应用系统对功能，可靠性，成本，体积，工号严格要求的专用计算机系统。</li>
<li>从系统的角度定义：嵌入式系统是设计完成复杂功能的硬件和软件，并使其紧密耦合在一起的计算机系统。术语嵌入式反映了这些系统通常是更大系统中的一个完整的部分称为嵌入的系统。嵌入的系统中可以共存多个嵌入式系统。</li>
<li>即使不可见，嵌入式系统也无处不在。嵌入式系统应用在工业自动化、国防、运输和航天领域中。例如神舟飞船和长征火箭中有很多嵌入式系统，导弹的制导系统也是嵌入式系统，高档汽车中有多大几十个嵌入式系统。</li>
<li>在日常生活中，人们使用各种嵌入式系统，但未必知道它们。事实上，几乎所有带一点“智能”的家电（全自动洗衣机、电脑电饭煲等）都是嵌入式系统。</li>
</ul>
<h3 id="嵌入式系统的应用领域">嵌入式系统的应用领域</h3>
<p>交通管理、信息家电、智能玩具、机器人、军事电子、通信设备、网络设备、移动计算、医疗仪器、电子商务、环境监测、汽车电子、智能仪器、工控设备等等。</p>
<h2 id="嵌入式系统与单片机系统的区别">嵌入式系统与单片机系统的区别</h2>
<h3 id="嵌入式系统不等于单片机系统">嵌入式系统不等于单片机系统</h3>
<ul>
<li>目前嵌入式系统的主流是以32位嵌入式微处理器为核心的硬件设计和基于实时操作系统（RTOS）的软件设计。</li>
<li>单片机系统多为4位、8位、16位机，不适合运行操作系统，难以进行较为复杂的运算和处理功能。</li>
<li>嵌入式系统强调基于平台的设计，软硬件协同设计，单片机大多采用软硬件流水设计。</li>
<li>嵌入式系统设计的核心是软件设计（大概占70%），单片机系统软硬件设计所占比例基本相同。</li>
</ul>
<h3 id="学习方法上的不同">学习方法上的不同</h3>
<p>单片机学习一般从硬件入手，从硬件体系结构、汇编语言到硬件设计、软件设计。</p>
<p>嵌入式系统可以从软件入手，从应用层编程到操作系统移植，硬件平台设计较好，按单片机设计的流程较难掌握。</p>
<h3 id="嵌入式系统不等于PC机">嵌入式系统不等于PC机</h3>
<ul>
<li>嵌入式系统一般是专用系统，而计算机是通用计算平台</li>
<li>嵌入式系统的资源比PC少的多</li>
<li>嵌入式系统的软件故障带来的后果比PC机大的多</li>
<li>嵌入式系统一般采用实时操作系统</li>
<li>嵌入式系统大多有成本、功耗要求</li>
<li>嵌入式系统得到多种微处理体系的支持</li>
<li>嵌入式系统需要专用的开发工具</li>
</ul>
<h2 id="实时操作系统">实时操作系统</h2>
<h3 id="实时操作系统定义">实时操作系统定义</h3>
<blockquote>
<p>POSIX 1003.b 定义（一个用于实时编程的标准）</p>
<p>实时操作系统：能够在限定响应时间内提供所需水平服务的计算机系统</p>
</blockquote>
<blockquote>
<p>一般性定义</p>
<p>一个实时系统是指计算的正确性不仅取决于程序的逻辑性，也取决于结果产生的时间，如果系统的时间约束条件得不到满足，将会发生系统出错。</p>
</blockquote>
<p><strong>注意</strong>：实时并不等于快！他是一个相对的概念，确切定义应该是“及时”，即在系统允许的时间范围内完成任务。</p>
<h3 id="实时系统衡量指标">实时系统衡量指标</h3>
<ul>
<li>响应时间</li>
<li>吞吐量</li>
<li>生存时间</li>
</ul>
<h4 id="实时性">实时性</h4>
<p>从广义概念上讲，嵌入式系统都可以看成是一个实时系统。</p>
<h4 id="优缺点">优缺点</h4>
<ul>
<li>优点：设计和扩展变得容易，使应用程序的设计过程大为简化。</li>
<li>缺点：嵌入式实时操作系统需要额外的ROM/RAM开销，2~5%的CPU额外负荷以及内核的费用。</li>
</ul>
<h2 id="嵌入式的特征">嵌入式的特征</h2>
<ul>
<li>技术密集：嵌入式系统是计算机技术、微电子技术和行业技术相结合的产物。</li>
<li>成本敏感：嵌入式产品每一批次的产品数量大，单位成本对产品的市场前景和利润影响极大。</li>
<li>专用紧凑：嵌入式系统在体积、功耗、配置、处理能力、电磁兼容性等方面有明显的应用约束。</li>
<li>开发困难：无法直接在目标机上开发，需要宿主机和目标机之间建立连接，进行交叉开发。</li>
<li>安全可靠：可靠性要求极高，网络信息安全，防危安全</li>
<li>不可垄断：嵌入式是个分散的工业，没有哪个系列的处理器和操作系统能够垄断全部市场。</li>
<li>多种多样：嵌入式处理器种类繁多，外设随应用领域变化，操作系统五花八门，嵌入式开发工具不一，嵌入式系统实时性多样化，应用领域广泛。</li>
<li>及时响应：嵌入式系统需要实时性保障，能够尽可能快的对外部技术过程的请求发出响应，<strong>及时</strong>完成。</li>
<li>其他：确定性
<ul>
<li>任务个数确定</li>
<li>每个任务<strong>执行时序</strong>确定</li>
<li>每个任务所占资源等确定</li>
<li>任务间通信延迟确定</li>
</ul>
</li>
</ul>
<h2 id="发展历程">发展历程</h2>
<p>处理器集成度越来越高，RTOS功能越来越强大，嵌入式中间件迅速发展，开发环境逐渐完善，应用领域覆盖完全。</p>
<ul>
<li>萌芽阶段
<ul>
<li>工业应用、军事应用</li>
<li>检测、伺服、指示功能</li>
<li>汇编语言</li>
<li>无操作系统</li>
<li>单芯片可编程控制器</li>
</ul>
</li>
<li>简单系统阶段
<ul>
<li>家电、医疗、仪器仪表、通信</li>
<li>简单工具，xray，无gui</li>
<li>汇编语言</li>
<li>无OS，VRTX</li>
<li>8位MCUDSP</li>
</ul>
</li>
<li>RTOS阶段
<ul>
<li>消费电子、手机、汽车电子等等</li>
<li>GUI、网络、文件系统等等</li>
<li>汇编、C、C++</li>
<li>32位嵌入式处理器</li>
</ul>
</li>
<li>网络化阶段
<ul>
<li>智能家电、联网设备、无线终端等等</li>
<li>Internet、流媒体、数据库</li>
<li>Soc芯片、多核</li>
</ul>
</li>
</ul>
<h2 id="分类">分类</h2>
<ul>
<li>
<p>按处理器位数划分：4、8、16、32、64位系统</p>
</li>
<li>
<p>按应用类别划分：</p>
</li>
<li>
<p>按系统的实时性划分</p>
<ul>
<li>硬实时   汽车的ABS和安全气囊系统、飞行控制系统、核电站控制系统</li>
<li>软实时   电视信号、证券交易</li>
<li>自适应实时   自动调整满足环境需要，保证性能级别</li>
</ul>
</li>
<li>
<p>按工业界应用的复杂程度划分</p>
<ul>
<li>简单单处理器系统</li>
<li>可扩展单处理器系统</li>
<li>复杂嵌入式系统</li>
<li>制造或过程控制中使用的计算机控制系统</li>
</ul>
</li>
</ul>
<h1 id="第二章-操作系统">第二章 操作系统</h1>
<h2 id="存在的问题">存在的问题</h2>
<ol>
<li>各种逻辑分析、关系处理复杂，难度大</li>
<li>功能任务与逻辑判断混杂缠绕</li>
</ol>
<p>能否只编写功能任务代码？</p>
<h2 id="计算机操作系统">计算机操作系统</h2>
<ul>
<li>操作系统是一种为应用程序提供服务的系统软件，是一个完整计算机系统的有机组成部分。</li>
<li>从层次上看，操作系统位于计算机硬件之上，应用软件之下，所以也把它叫做应用软件的运行平台。</li>
<li>计算机硬件系统、操作系统、系统软件、应用软件</li>
</ul>
<h3 id="计算机操作系统的作用">计算机操作系统的作用</h3>
<ul>
<li>它在计算机应用程序与计算机硬件之间，屏蔽了计算机硬件工作的一些细节，并对系统中的资源进行有效的管理。</li>
<li>通过提供函数（应用程序接口，API），从而使应用程序的设计人员得以在一个友好的平台上进行应用程序的设计和开发，大大地提高了应用程序的开发效率。</li>
<li>操作系统：用汇编语言编写的硬件抽象层，高级语言接口</li>
<li>从用户角度来看，它就是一大堆函数（API和系统函数），用户可以调用（普通调用或系统调用）它们来对系统资源进行操作。</li>
</ul>
<h3 id="操作系统的功能">操作系统的功能</h3>
<ul>
<li>任务管理：任务表</li>
<li>存储管理：存储分配表</li>
<li>文件管理：文件目录</li>
<li>处理器的管理</li>
<li>网络和通信管理</li>
<li>I/O设备管理：设备表</li>
</ul>
<p>总之，需要一大堆表。</p>
<h3 id="操作系统中经常使用的数据结构">操作系统中经常使用的数据结构</h3>
<h4 id="数组">数组</h4>
<ul>
<li>同一数据类型数据的集合</li>
<li>占用连续内存空间</li>
<li>其中所有元素名称相同，但每个元素都有一个编号</li>
<li>元素名去掉编号（下标），得到的是数组名，数组名是个指针</li>
<li>使用上的特点
<ul>
<li>分类存放</li>
<li>检索速度快、恒定</li>
<li>占用连续空间大</li>
</ul>
</li>
<li>用于记录同类事物的表</li>
</ul>
<h4 id="位图">位图</h4>
<p>位图是数组的一种特殊应用，记录事物的状态。</p>
<p>应用于登记表</p>
<h4 id="结构体">结构体</h4>
<ul>
<li>不同类型数据的集合</li>
<li>占用连续内存空间</li>
<li>使用上的特点
<ul>
<li>不分类存放，但用来描述同一事物</li>
<li>检索速度快且恒定</li>
</ul>
</li>
<li>应用于通讯录中的一条记录、工具箱、厨房等等</li>
</ul>
<h4 id="链表">链表</h4>
<ul>
<li>
<p>同类型数据的集合</p>
</li>
<li>
<p>不占用连续的内存空间</p>
</li>
<li>
<p>使用上的特点</p>
<ul>
<li>分类存放，但空间上不连续（不需要大量的连续存储空间）</li>
<li>检索速度慢，且耗费时间不固定</li>
</ul>
</li>
<li>
<p>应用于存放大量的较大的表，类似档案柜</p>
</li>
</ul>
<h4 id="队列">队列</h4>
<p>按照先进先出的规则组织的数据结构，可以用数组实现也可以用链表实现</p>
<p>主要用于对象的排队</p>
<h4 id="堆栈">堆栈</h4>
<p>按照先进后出的规则组织的数据结构，主要用数组实现</p>
<p>主要用于程序模块的嵌套运行</p>
<h3 id="什么是多任务操作系统">什么是多任务操作系统</h3>
<p>简单地说，就是能用一个处理器<strong>并发</strong>（注意不是同时！！）地运行多个程序的计算机管理系统。</p>
<blockquote>
<p>并发</p>
<p>由同一个处理器轮换地运行多个程序。或者说是由多个程序轮班地占用处理器这个资源。且在占用这个资源的期间，并不一定能够把程序运行完毕。</p>
</blockquote>
<h4 id="程序的切换">程序的切换</h4>
<p>PC（程序计数器）是个指路器，它指向哪儿，处理器就去哪儿，所以，哪个程序占用了PC，哪个程序就占用了CPU。</p>
<p>所谓的切换就是将目标程序的地址存入PC中。</p>
<p>不同的计算机类型指令是不同的。</p>
<ul>
<li>数据传送指令</li>
<li>子程序返回指令（由堆栈弹出）</li>
<li>中断服务程序返回指令（由堆栈弹出）</li>
</ul>
<p>综上，系统是通过把待运行程序的地址赋给程序计数器PC来实现程序的切换。</p>
<h2 id="嵌入式操作系统">嵌入式操作系统</h2>
<h3 id="概述">概述</h3>
<p>计算机系统由硬件和软件组成，在发展初期没有操作系统这个概念，用户使用<strong>监控程序</strong>来使用计算机。随着计算机技术的发展，计算机系统的硬件、软件资源也愈来愈丰富，监控程序已不能适应计算机应用的要求。于是在<strong>六十年代</strong>中期监控程序又进一步发展形成了<strong>操作系统</strong>(Operating System)。发展到现在，广泛使用的有三种操作系统即<strong>多道批处理操作系统、分时操作系统以及实时操作系统</strong>。</p>
<ul>
<li>多道批处理系统：适用于计算中心等较大的计算机系统</li>
<li>分时操作系统：适用于多个用户共享系统资源</li>
<li>实时操作系统：适用于嵌入式设备和有实时性要求的系统中</li>
</ul>
<h4 id="嵌入式系统的基本结构">嵌入式系统的基本结构</h4>
<img src="https://s1.ax1x.com/2020/06/08/tWmQG6.png" alt="tWmQG6.png" border="0" width="40%"/>
<h4 id="嵌入式系统硬件组成">嵌入式系统硬件组成</h4>
<img src="https://s1.ax1x.com/2020/06/08/tWmHeJ.png" alt="tWmHeJ.png" border="0" width="80%"/>
<h4 id="嵌入式系统软件组成">嵌入式系统软件组成</h4>
<img src="https://s1.ax1x.com/2020/06/08/tWnAYt.png" alt="tWnAYt.png" border="0"  width=80% />
<h4 id="实时操作系统的特点">实时操作系统的特点</h4>
<p>IEEE 的实时UNIX分委会认为实时操作系统应具备以下的几点:</p>
<ul>
<li>异步的事件响应</li>
<li>切换时间和中断延迟时间确定</li>
<li>优先级中断和调度</li>
<li>抢占式调度</li>
<li>内存锁定</li>
<li>连续文件</li>
<li>同步</li>
</ul>
<p>总的来说实时操作系统是<strong>事件驱动</strong>的，能对来自外界的作用和信号在限定的时间范围内作出响应。它强调的是<strong>实时性</strong>、<strong>可靠性</strong>和<strong>灵活性</strong>, 与实时应用软件相结合成为有机的整体起着核心作用, 由它来管理和协调各项工作,为应用软件提供良好的运行软件环境及开发环境。</p>
<p>从实时系统的应用特点来看实时操作系统可以分为两种：<strong>一般实时操作系统</strong>和<strong>嵌入式实时操作系统</strong>。</p>
<p>一般实时操作系统应用于实时处理系统的上位机和实时查询系统等实时性较弱的实时系统，并且提供了开发、调试、运用一致的环境。</p>
<p>嵌入式实时操作系统应用于实时性要求高的实时控制系统，而且应用程序的开发过程是通过<strong>交叉开发</strong>来完成的，即开发环境与运行环境是不一致。嵌入式实时操作系统具有<strong>规模小</strong>(一般在几K～几十K 内)、<strong>可固化使用实时性强</strong>(在毫秒或微秒数量级上)的特点 。</p>
<h3 id="基本概念">基本概念</h3>
<h4 id="前后台系统">前后台系统</h4>
<p>对基于芯片的开发来说，应用程序一般是一个<strong>无限的循环</strong>，可称为<strong>前后台系统</strong>或<strong>超循环系统</strong>。</p>
<p>很多基于微处理器的产品采用前后台系统设计，例如微波炉、电话机、玩具等。在另外一些基于微处理器应用中，从省电的角度出发，平时微处理器处在停机状态，所有事都靠<strong>中断服务</strong>来完成。</p>
<img src="https://s1.ax1x.com/2020/06/08/tWcbFJ.png" alt="tWcbFJ.png" border="0" width="80%"/>
<h4 id="操作系统">操作系统</h4>
<p>操作系统是计算机中<strong>最基本的程序</strong>。操作系统负责计算机系统中全部软硬资源的<strong>分配与回收</strong>、<strong>控制与协调</strong>等并发的活动；操作系统提供用户接口，使用户获得良好的<strong>工作环境</strong>；操作系统为用户扩展新的系统功能提供软件平台。</p>
<img src="https://s1.ax1x.com/2020/06/08/tWguTg.png" alt="tWguTg.png" border="0" width="30%"/>
<h4 id="实时操作系统-2">实时操作系统</h4>
<p>实时操作系统是一段在嵌入式系统启动后首先执行的<strong>背景程序</strong>，用户的应用程序是运行于RTOS之上的各个任务，RTOS根据各个任务的要求，进行<strong>资源</strong>(包括存储器、外设等)管理、消息管理、任务调度、异常处理等工作。在RTOS支持的系统中， <strong>每个任务均有一个优先级</strong>，RTOS根据各个任务的优先级，动态地切换各个任务，保证对实时性的要求。</p>
<h4 id="代码临界区">代码临界区</h4>
<p>代码的临界区也称为临界区，指<strong>处理时不可分割的代码</strong>，运行这些代码不允许被打断。一旦这部分代码开始执行，则<strong>不允许任何中断打入</strong>（这不是绝对的，如果中断不调用任何包含临界区的代码，也不访问任何临界区使用的共享资源，这个中断可能可以执行）。为确保临界区代码的执行，在进入临界区之前要<strong>关中断</strong>，而临界区代码执行完成以后要立即<strong>开中断</strong>。</p>
<h4 id="资源">资源</h4>
<p>程序运行时可使用的<strong>软、硬件环境</strong>统称为资源。资源可以是输入输出设备，例如打印机、键盘、显示器。资源也可以是一个变量、一个结构或一个数组等。</p>
<h4 id="共享资源">共享资源</h4>
<p>可以被一个以上任务使用的资源叫做<strong>共享资源</strong>。为了防止数据被破坏，每个任务在与共享资源打交道时，必须独占该资源，这叫做<strong>互斥</strong>。</p>
<img src="https://s1.ax1x.com/2020/06/08/tWoFfO.png" alt="tWoFfO.png" border="0" width="60%"/>
<h4 id="任务">任务</h4>
<p>一个任务，也称作一个<strong>线程</strong>，是一个简单的程序，该程序可以认为CPU完全属于该程序自己。实时应用程序的设计过程，包括如何把问题分<strong>割成多个任务</strong>，每个任务都是整个应用的某一部分，每个任务被赋予一定的优先级，有它自己的一套CPU寄存器和自己的栈空间。</p>
<h4 id="任务切换">任务切换</h4>
<p>当多任务内核决定运行另外的任务时，它保存正在运行任务的当前状态，即CPU寄存器中的全部内容。这些内容保存在任务的当前状态保存区，也就是任务自已的栈区之中。入栈工作完成以后，就把下一个将要运行的任务的当前状态从任务的栈中重新装入CPU的寄予存器，并开始下一个任务的运行。这个过程就称为<strong>任务切换</strong>。这个过程增加了应用程序的额外负荷。CPU的内部寄存器越多，额外负荷就越重。做任务切换所需要的时间取决于CPU有多少寄存器要入栈。</p>
<h4 id="内核">内核</h4>
<p>多任务系统中，内核负责管理各个任务，或者说为<strong>每个任务分配CPU时间</strong>，并且负责任务之间的<strong>通信</strong>。内核提供的基本服务是<strong>任务切换</strong>。使用实时内核可以大大<strong>简化</strong>应用系统的设计，是因为实时内核允许将应用分成若干个任务，由<strong>实时内核来管理它们</strong>。内核需要<strong>消耗一定的系统资源</strong>，比如2％～5％的CPU运行时间、RAM和ROM等。</p>
<p>内核提供必不可少的系统服务，如信号量、消息队列、延时等。</p>
<h4 id="调度">调度</h4>
<p>调度是内核的主要职责之一。<strong>调度就是决定该轮到哪个任务运行了</strong>。多数实时内核是基于<strong>优先级</strong>调度法的。每个任务根据其重要程度的不同被赋予一定的优先级。基于优先级的调度法指CPU总是让处在就绪态的优先级最高的任务先运行。然而究竟何时让高优先级任务掌握CPU的使用权，有两种不同的情况，这要看用的是什么类型的内核，是非占先式的还是占先式的内核。</p>
<h4 id="非占先式内核">非占先式内核</h4>
<p>非占先式内核要求每个任务自我放弃CPU 的所有权。非占先式调度法也称作<strong>合作型多任务</strong>，各个任务彼此合作共享一个CPU。异步事件还是由中断服务来处理。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务，直到该任务主动放弃CPU的使用权时，那个高优先级的任务才能获得CPU的使用权。</p>
<h4 id="占先式内核">占先式内核</h4>
<p>当<strong>系统响应时间</strong>很重要时，要使用占先式内核。因此绝大多数商业上销售的实时内核都是占先式内核。最高优先级的任务一旦就绪，总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪状态，当前任务的CPU使用权就被剥夺了，或者说被<strong>挂起</strong>了，那个高优先级的任务立刻得到了<strong>CPU的控制权</strong>。如果是中断服务子程序使一个高优先级的任务进入就绪态，中断完成时，中断了的任务被挂起，<strong>优先级高的那个任务开始运行</strong>。</p>
<h4 id="任务优先级">任务优先级</h4>
<p>任务的优先级是表示任务被调度的优先程度。每个任务都具有优先级。任务越重要，赋予的优先级应越高，越容易被调度而进入运行态。</p>
<h4 id="中断">中断</h4>
<p>​    中断是一种<strong>硬件机制</strong>，用于通知CPU有个异步事件发生了。中断一旦被识别，CPU保存部分（或全部）上下文即部分或全部寄存器的值，跳转到专门的子程序，称为<strong>中断服务子程序</strong>（ISR）。中断服务子程序做事件处理，处理完成后，程序回到：</p>
<ol>
<li>
<p>在前后台系统中，程序回到后台程序</p>
</li>
<li>
<p>对非占先式内核而言，程序回到被中断了的任务</p>
</li>
<li>
<p>对占先式内核而言，让进入就绪态的优先级最高的任务开始运行</p>
</li>
</ol>
<img src="https://s1.ax1x.com/2020/06/08/tWbkVA.png" alt="tWbkVA.png" border="0" />
<h4 id="时钟节拍">时钟节拍</h4>
<p>​    时钟节拍是特定的<strong>周期性中断</strong>。这个中断可以看作是系统心脏的脉动。中断之间的时间间隔取决于不同应用，一般在10ms到200ms之间。时钟的节拍式中断使得内核可以将<strong>任务延时</strong>若干个整数时钟节拍，以及当任务等待事件发生时，提供<strong>等待超时的依据</strong>。时钟节拍率越快，系统的额外开销就越大。</p>
<h3 id="使用实时操作系统的必要性">使用实时操作系统的必要性</h3>
<p>嵌入式实时操作系统在目前的嵌入式应用中用得越来越广泛，尤其在功能复杂、系统庞大的应用中显得愈来愈重要。在嵌入式应用中，只有把CPU嵌入到系统中，同时又把操作系统嵌入进去，才是真正的计算机嵌入式应用。使用实时操作系统主要有以下几个因素：</p>
<ul>
<li>嵌入式实时操作系统提高了<strong>系统的可靠性</strong>。</li>
<li>提高了开发效率，<strong>缩短了开发周期</strong>。</li>
<li>嵌入式实时操作系统充分发挥了32位CPU的多任务潜力。</li>
</ul>
<h3 id="实时操作系统的优缺点">实时操作系统的优缺点</h3>
<p>优点：在嵌入式实时操作系统环境下开发实时应用程序使<strong>程序的设计和扩展变得容易</strong>，不需要大的改动就可以增加新的功能。通过将应用程序分割成若干独立的任务模块，使应用程序的设计过程大为<strong>简化</strong>；而且对实时性要求苛刻的事件都得到了快速、可靠的处理。通过有效的系统服务，嵌入式实时操作系统使得系统资源得到更好的利用。</p>
<p>缺点：使用嵌入式实时操作系统需要<strong>额外的ROM/RAM开销</strong>，2~5%的CPU额外负荷，以及内核的费用。</p>
<h3 id="常见的嵌入式操作系统">常见的嵌入式操作系统</h3>
<h4 id="嵌入式Linux">嵌入式Linux</h4>
<p>uClinux是一个完全符合GNU/GPL公约的操作系统，完全开放代码。uClinux从Linux 2.0/2.4内核派生而来，沿袭了主流Linux的绝大部分特性。它保留了Linux的大部分优点：</p>
<p>稳定、良好的移植性、优秀的网络功能、完备的对各种文件系统的支持、以及标准丰富的API等。</p>
<h4 id="WinCE">WinCE</h4>
<p>Windows CE是微软开发的一个开放的、可升级的32位嵌入式操作系统，Win CE不仅继承了传统的Windows图形界面，并且在Win CE平台上可以使用Windows 95/98上的编程工具（如Visual Basic、Visual C++等）、使绝大多数的应用软件只需简单的修改和移植就可以在Windows CE平台上继续使用。</p>
<h4 id="VxWorks">VxWorks</h4>
<p>VxWorks操作系统是美国WIND RIVER公司于1983年设计开发的一种嵌入式实时操作系统（RTOS），是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境，在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中，如卫星通讯、军事演习、弹道制导、飞机导航等，甚至在1997年4月登陆火星表面的火星探测器上也使用到了VxWorks。</p>
<h4 id="OSE">OSE</h4>
<p>OSE主要是由ENEA Data AB 下属的ENEA OSE Systems AB负责开发和技术服务的，一直以来都充当着实时操作系统以及分布式和容错性应用的先锋，并保持良好的发展态势。</p>
<p>OSE的客户深入到电信，数据，工控，航空等领域，尤其在电信方面，该公司已经有了十余年的开发经验，同诸如爱立信，诺基亚，西门子等知名公司确定了良好的关系。</p>
<h4 id="Nucleus">Nucleus</h4>
<p>Nucleus PLUS是为实时嵌入式应用而设计的一个抢先式多任务操作系统内核，其95％的代码是用ANSI C写成的，因此非常便于移植并能够支持大多数类型的处理器。<br>
Nucleus PLUS采用了软件组件的方法。每个组件具有单一而明确的目的，通常由几个C及汇编语言模块构成，提供清晰的外部接口，对组件的引用就是通过这些接口完成的。由于采用了软件组件的方法，使Nucleus PLUS 的各个组件非常易于替换和复用。</p>
<h4 id="eCos">eCos</h4>
<p>eCos是RedHat公司开发的源代码开放的嵌入式RTOS产品，是一个可配置、可移植的嵌入式实时操作系统，设计的运行环境为RedHat的GNUPro和GNU开发环境。eCOS的所有部分都开放源代码，可以按照需要自由修改和添加。eCOS的关键技术是操作系统可配置性，允许用户组和自己的实时组件和函数以及实现方式，特别允许eCOS的开发则定制自己的面向应用的操作系统，使eCos能有更广泛的应用范围。</p>
<h4 id="μC-OS-II">μC/OS-II</h4>
<p>μC/OS-II是一个<strong>源码公开</strong>、可移植、可固化、<strong>可裁剪</strong>、<strong>占先式</strong>的实时多任务操作系统。其绝大部分源码是用ANSI C写的，使其可以方便的移植并支持大多数类型的处理器。μC/OS-II通过了联邦航空局（FAA）商用航行器认证。自1992年问世以来，μC/OS-II已经被应用到数以百计的产品中。μC/OS-II占用很少的系统资源，并且在高校教学使用是不需要申请许可证。</p>
<h4 id="Android">Android</h4>
<p>Android是一种基于Linux的自由及开放源代码的操作系统，主要使用于移动设备，由Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发，主要支持手机。2005年8月由Google收购注资。2007年11月，Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式，发布了Android的源代码。</p>
<h4 id="iOS">iOS</h4>
<p>IOS是苹果公司开发的类Unix商业操作系统，于2007年1月9日的Macworld大会上公布。</p>
<h4 id="ulTRON">ulTRON</h4>
<p>TRON明确的设计目标使其甚至比Linux更适合于做嵌入式应用，内核小，启动速度快，即时性能好，也很适合汉字系统的开发。另外，TRON的成功还来源于如下两个重要的条件：</p>
<pre><code>    1. 它是免费的
       2. 它已经建立了开放的标准，形成了较完善的软硬件配套开发环境，较好地形成了产业化
</code></pre>
<h2 id="GNU计划">GNU计划</h2>
<p>有译为“革奴计划”，是由理查德·斯托曼在1983年9月27日公开发起的，它的目标是创建一套完全自由的操作系统。<br>
GNU是“GNU’s Not UNIX”的缩写，斯托曼宣布GNU应当发音为“Guh-NOO”（/ˈgnuː/ ）</p>
<ol>
<li>不论目的为何，可以自由使用该种软件。</li>
<li>研究该软件如何运作的自由，并且得以改写该软件来符合使用者自身的需求，取得该软件之源码为达成此目的之前提。</li>
<li>重新散布该软件的自由。</li>
<li>有改善再利用该软件的自由，并且可以发表改写版供公众使用，如此一来，整个社群都可以受惠，如前项，取得该软件之源码为达成此目的之前提。</li>
</ol>
<h1 id="μC-OS-II微小内核分析">μC/OS-II微小内核分析</h1>
<h2 id="概述-2">概述</h2>
<h3 id="μC-OS-II微小内核简介">μC/OS-II微小内核简介</h3>
<p>μC/OS-II 嵌入式实时操作系统的源代码可以分成三部分：</p>
<ul>
<li>与硬件无关的内核代码</li>
<li>与处理器有关的移植代码</li>
<li>用户配置文件</li>
</ul>
<img src="https://s1.ax1x.com/2020/06/08/tWXwSx.png" alt="tWXwSx.png" border="0" />
<h3 id="内核代码">内核代码</h3>
<p>内核代码位于source目录下，提供了4个微小内核。它们分别位于source\SOURCE1（包含建立任务和延时功能）、source\SOURCE2（增加删除任务功能）、source\SOURCE3（增加信号量文件）和source\SOURCE4（增加删除信号量功能）。它们的功能依次增强，代码也依次增大。</p>
<p>以上代码并没有完全裁减到最小，还包含了一些参数校验代码等非必需代码，μC/OS-II的代码裁减功能也同时保留，这些代码大约50多行。</p>
<h3 id="移植代码">移植代码</h3>
<p>移植代码分别为OS_CPU_C.C（移植代码C语言部分）、OS_CPU_a.S（移植代码汇编语言部分）、OS_CPU.H（移植代码头文件）和IRQ.INC（移植代码与芯片无关的中断处理接口程序）4个文件。</p>
<h3 id="配置文件">配置文件</h3>
<p>配置文件是每个μC/OS-II程序必备的文件，而且不同的程序一般不一样，但大小基本上相同。配置文件范例位于H目录下，分别为INCLUDES.H（内核需要的头文件，对于特定的移植，一般不需要改变）和OS_CFG.H（内核配置的头文件，一般需要根据程序的需求修改其常量的内容）文件。<br>
一般来说，每个应用程序都有自己的配置文件拷贝，并很可能与范例不同。</p>
<h3 id="函数说明">函数说明</h3>
<h4 id="OSInit">OSInit</h4>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OSInit</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td><code>void OSInit(void)</code></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>初始化μC/OS-Ⅱ，无函数参数和返回值</td>
</tr>
<tr>
<td><strong>特殊说明</strong></td>
<td>必须在调用OSStart()函数之前调用OSInit()，而只有在调用OSStart()函数之后，μC/OS-Ⅱ才真正开始运行多任务</td>
</tr>
</tbody>
</table>
<h4 id="OSStart">OSStart</h4>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OSStart</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td><code>void OSStart(void)</code></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>启动μC/OS-II的多任务环境，无函数参数和返回值</td>
</tr>
<tr>
<td><strong>特殊说明</strong></td>
<td>在调用OSStart( )之前必须先调用OSInit ( )。在用户程序中OSStart( )只能被调用一次，第二次调用OSStart( )将不执行任何操作</td>
</tr>
</tbody>
</table>
<p>####　OSTaskCreate</p>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OSTaskCreate</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td><code>INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)</code></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>建立一个新任务。既可以在多任务环境启动之前，也可以在正在运行的任务中创建任务</td>
</tr>
<tr>
<td><strong>函数参数</strong></td>
<td>task：指向任务代码的指针（函数指针） pdata：传递给任务的参数(一个变量指针) ptos ：指向任务堆栈栈顶的指针       prio ：任务的优先级</td>
</tr>
<tr>
<td><strong>特殊说明</strong></td>
<td>任务堆栈必须声明为OS_STK类型。注意：在中断处理程序中不能建立任务。在任务中必须调用μC/OS提供的下述过程之一：延时等待、任务挂起、等待事件发生（等待信号量，消息邮箱、消息队列），以便其它任务也能获得CPU的使用权</td>
</tr>
</tbody>
</table>
<h4 id="OSTimeDly">OSTimeDly</h4>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OSTimeDly</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td><code>void OSTimeDly (INT16U ticks)</code></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>将一个任务延时若干个时钟节拍，无函数返回值。延时时间的长度可从0到65535个时钟节拍，延时时间0表示不进行延时，函数将立即返回调用者，延时的具体时间依赖于系统每秒钟有多少时钟节拍（由文件OS_CFG…H中的常量OS_TICKS_PER _SEC设定）</td>
</tr>
<tr>
<td><strong>函数参数</strong></td>
<td>ticks：要延时的时钟节拍数</td>
</tr>
<tr>
<td><strong>特殊说明</strong></td>
<td>延时时间0表示不进行延时操作，而立即返回调用者。为了确保设定的延时时间，建议用户设定的时钟节拍数加1。例如，希望延时10个时钟节拍，可设定参数为11</td>
</tr>
</tbody>
</table>
<h4 id="OSTimeTick">OSTimeTick</h4>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OSTimeTick</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td><code>void OSTimeTick(void)</code></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>在每次时钟节拍中断服务程序中被调用，无函数参数和返回值。OSTimeTick()检查处于延时状态的任务是否达到延时时间，或正在等待事件的任务是否超时</td>
</tr>
<tr>
<td><strong>特殊说明</strong></td>
<td>OSTimeTick()的运行时间和系统中的任务数直接相关，在任务或中断中都可以调用。如果在任务中调用，任务的优先级应该很高（优先级数字很小），这是因为OSTimeTick()负责所有任务的延时操作</td>
</tr>
</tbody>
</table>
<h4 id="OSTaskDel">OSTaskDel</h4>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OSTaskDel</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td><code>INT8U OSTaskDel (INT8U prio)</code></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>删除一个指定优先级的任务。被删除的任务将回到休眠状态，任务被删除后可以用函数OSTaskCreate()重新建立</td>
</tr>
<tr>
<td><strong>函数参数</strong></td>
<td>prio ：指定要删除任务的优先级，如果为OS_PRIO_SELF则删除自身</td>
</tr>
<tr>
<td><strong>函数返回值</strong></td>
<td>OS_NO_ERR：函数调用成功 OS_TASK_DEL_IDLE：错误，试图删除空闲任务（Idle task） OS_TASK_DEL_ ERR：错误，指定要删除的任务不存在 OS_PRIO_INVALID：参数指定的优先级大于OS_LOWEST_PRIO OS_TASK_DEL_ISR：错误，试图在中断处理程序中删除任务</td>
</tr>
</tbody>
</table>
<h4 id="OSIntEnter">OSIntEnter</h4>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OSIntEnter</th>
<th><strong>所属文件</strong></th>
<th>OS_CORE.C</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td>void OSIntEnter (void)</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>通知μC/OS-Ⅱ一个中断服务已开始执行，这有助于μC/OS-Ⅱ掌握中断嵌套的情况。通常OSIntExit()和OSIntEnter()联合使用，无函数参数和返回值</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>特殊说明</strong></td>
<td>在中断服务程序中，如果保证直接递增OSIntNesting“<strong>原子操作</strong>”，中断服务程序使用直接递增OSIntNesting的方法而不调用OSIntEnter()函数 <strong>何为原子操作？在一个任务的执行过程中，如果有某些操作不希望在执行过程中被别的任务或中断打断，那么这些不希望被打断的操作就是原子操作</strong></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h4 id="OSIntExit">OSIntExit</h4>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OSIntExit</th>
<th><strong>所属文件</strong></th>
<th>OS_CORE.C</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td>void OSIntExit(void)</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>通知μC/OS-Ⅱ一个中断服务已执行完毕，这有助于μC/OS-Ⅱ掌握中断嵌套的情况。通常OSIntExit()和OSIntEnter()联合使用。当最后一层嵌套的中断执行完毕后，如果有更高优先级的任务准备就绪，μC/OS-Ⅱ会调用任务调度函数，在这种情况下，中断返回到更高优先级的任务而不是被中断了的任务。无函数参数和返回值</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>特殊说明</strong></td>
<td>在任务级不能调用该函数。即使中断服务程序使用直接递增OSIntNesting的方法（没有调用OSIntEnter()），也必须调用OSIntExit()函数</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h4 id="禁止-允许中断函数">禁止/允许中断函数</h4>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()</th>
<th><strong>所属文件</strong></th>
<th>移植代码</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td>由移植代码决定</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>一般来说，OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()为定义的宏，用来禁止、打开CPU的中断，无函数参数和返回值</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>特殊说明</strong></td>
<td>OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()必须成对使用</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h4 id="OSSemCreate">OSSemCreate</h4>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OSSemCreate</th>
<th><strong>所属文件</strong></th>
<th>OS_SEM.C</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td>OS_EVENT *OSSemCreate (INT16U cnt)</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>建立并初始化一个信号量</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>函数参数</strong></td>
<td>cnt ：建立的信号量的初始值，可以取0到65535之间的任何值</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>函数返回值</strong></td>
<td>正常 ： 指向分配给所建立的信号量的事件控制块的指针 NULL ：没有可用的事件控制块</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>特殊说明</strong></td>
<td>必须先建立信号量，然后使用</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h4 id="OSSemPend">OSSemPend</h4>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OSSemPend</th>
<th><strong>所属文件</strong></th>
<th>OS_SEM.C</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td>void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>等待信号量：当任务调用OSSemPend()函数时，如果信号量的值大于零，那么OSSemPend()函数对该值减一并返回：如果调用时信号量等于零，那么OSSemPend()函数将任务加入该信号量的等待列表，任务将等待直到获得信号量或超时</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>函数参数</strong></td>
<td>cnt ：建立的信号量的初始值，可以取0到65535之间的任何值</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>特殊说明</strong></td>
<td>必须先建立信号量，然后使用，不允许在中断中调用该函数， 因为中断不能被挂起</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h4 id="OSSemPost">OSSemPost</h4>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OSSemPost</th>
<th><strong>所属文件</strong></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td>INT8U OSSemPost (OS_EVENT *pevent)</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>发送信号量：如果指定的信号量是零或大于零，OSSemPost（）函数递增该信号量并返回。如果有任务在等待信号量，则最高优先级的任务将得到信号量并进入就绪状态。然后进行任务调度，决定当前运行的任务是否仍然为处于最高优先级的就绪态的任务</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>函数参数</strong></td>
<td>pevent ：指向信号量的指针，OSSemCreate()的返回值</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>函数返回值</strong></td>
<td>OS_NO_ERR ：发送信号量成功 OS_SEM_OVF ：信号量的值溢出 OS_ERR_EVENT_TYPE ：pevent 不是指向信号量的指针 OS_ERR_PEVENT_NULL ：错误，pevent为NULL</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>特殊说明</strong></td>
<td>必须先建立信号量，然后使用</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h4 id="OSSemDel">OSSemDel</h4>
<table>
<thead>
<tr>
<th><strong>函数名称</strong></th>
<th>OSSemDel</th>
<th><strong>所属文件</strong></th>
<th>OS_SEM.C</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>函数原型</strong></td>
<td>OS_EVENT *OSSemDel (OS_EVENT *pevent, INT8U opt, INT8U *err)</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>功能描述</strong></td>
<td>删除信号量：在删除信号量之前，应当删除可能会使用这个信号量的任务</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>函数参数</strong></td>
<td>pevent：指向信号量的指针，OSSemCreate()的返回值 opt：定义信号量删除条件      －OS_DEL_NO_PEND：没有任何任务等待信号量才删除      －OS_DEL_ALWAYS：立即删除 err：用于返回错误码</td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>特殊说明</strong></td>
<td>(1)使用这个函数调用时，必须特别小心，因为其它任务可能还要用这个信号量 (2)当挂起任务就绪时，中断关闭时间与挂起任务数目有关 (3)其它任务并不知道信号量被删除，除非检查pevent是否指向NULL</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="最小内核">最小内核</h2>
<h4 id="什么是任务">什么是任务</h4>
<p>在实时多任务系统下运行的应用软件程序就是任务。在没有使用OS的前后台系统中，我们可以认为main函数以及通过main函数调用的全体函数为一个任务。<br>
通常将“并行程序执行的基本逻辑单位”称之为“任务”，也就是说任务是可以被分割为独立的且可并行执行的基本逻辑单位程序。一个任务的程序是顺序执行的，而不同任务的程序却是并行执行的。任务必须包括相互“独立”和“并行”执行两个方面。</p>
<h4 id="独立">独立</h4>
<p>独立具体指任务不能彼此直接调用，也不能直接进行数据交换。通过内核进行任务调度和数据交换。</p>
<p>####　并行执行</p>
<p>想象相互独立的任务各自拥有一个CPU，每个CPU各自执行各自的任务，此即任务的并行执行。但实际上CPU只有一个，我们认为操作系统为每个任务<strong>虚拟了一个CPU</strong>。</p>
<p>####　任务的状态</p>
<p>在μC/OS-Ⅱ中，任务有5种状态，分别为睡眠状态、就绪状态、运行状态、等待状态和被中断状态。</p>
<p><a href="https://imgchr.com/i/t4ik8S" target="_blank" rel="noopener"><img src="https://s1.ax1x.com/2020/06/09/t4ik8S.png" alt="t4ik8S.png" border="0" /></a></p>
<h4 id="任务控制快">任务控制快</h4>
<p>μC/OS-Ⅱ是通过任务控制块来管理任务的。任务控制块是一个<strong>基于链表的数据结构</strong>，任务控制块主要用于记录任务的堆栈栈顶指针、指向下一个任务控制块的指针、任务等待的延迟时间、任务的当前状态标志与任务的优先级别等一些与任务管理有关的属性。<br>
当任务的CPU使用权被剥夺时，μC/OS-Ⅱ用任务控制块来保存该任务的状态，从而保证任务重新获得CPU使用权时从断点处执行。</p>
<h4 id="任务就绪算法">任务就绪算法</h4>
<p>所谓就绪状态是指任务准备运行但CPU没空，任务等待运行的状态。<br>
任务就绪算法涉及“任务就绪表OSRdyTbl、映射表OSMapTbl、优先级判定表OSUnMapTbl以及变量OSRdyGrp和相关的任务优先级prio”，其中映射表OSMapTbl和优先级判定表OSUnMapTbl是2个常数表，用于查表算法。</p>
<h4 id="OS初始化">OS初始化</h4>
<p>μC/OS-II必须通过函数OSInit()初始化后才可以使用，该函数仅调用OS_InitMisc()、OS_InitRdyList()、OS_InitTCBList()和OS_InitTaskIdle() 4个函数。</p>
<img src="https://s1.ax1x.com/2020/06/09/t4MYsP.png" alt="t4MYsP.png" border="0" />
<h4 id="任务管理">任务管理</h4>
<p>μC/OS-Ⅱ通过任务控制块对任务进行管理，创建任务实际上就是给任务代码分配一个任务控制块，通过调用函数OSTaskCreate()实现。<br>
任务可以在多任务调度开始前建立，也可以在其它任务的执行过程中建立。在开始多任务调度之前，用户必须至少创建一个任务，但任务不能在中断服务程序（ISR）中建立。</p>
<h2 id="临界区与中断管理">临界区与中断管理</h2>
<h2 id="任务的结束">任务的结束</h2>
<h2 id="信号量">信号量</h2>
<h2 id="删除信号量">删除信号量</h2>

        </div>
        

    </article>
    
    <section id="comments">
        

        
    </section>


    

</main>


<aside style="" id="sidebar" class="aside aside-fixture">
    <div class="toc-sidebar">
        <nav id="toc" class="article-toc">
            <h3 class="toc-title">Catalogue</h3>
            <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#嵌入式系统"><span class="toc-number">1.</span> <span class="toc-text">嵌入式系统</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#第一章-嵌入式系统概论"><span class="toc-number">2.</span> <span class="toc-text">第一章 嵌入式系统概论</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#无所不在的嵌入式系统"><span class="toc-number">2.1.</span> <span class="toc-text">无所不在的嵌入式系统</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#嵌入式系统举例"><span class="toc-number">2.1.1.</span> <span class="toc-text">嵌入式系统举例</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#嵌入式的展现形式"><span class="toc-number">2.1.2.</span> <span class="toc-text">嵌入式的展现形式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#举例：遥测和遥信"><span class="toc-number">2.1.3.</span> <span class="toc-text">举例：遥测和遥信</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#什么叫嵌入？"><span class="toc-number">2.1.4.</span> <span class="toc-text">什么叫嵌入？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#嵌入式系统的概念"><span class="toc-number">2.1.5.</span> <span class="toc-text">嵌入式系统的概念</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#嵌入式系统的应用领域"><span class="toc-number">2.1.6.</span> <span class="toc-text">嵌入式系统的应用领域</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#嵌入式系统与单片机系统的区别"><span class="toc-number">2.2.</span> <span class="toc-text">嵌入式系统与单片机系统的区别</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#嵌入式系统不等于单片机系统"><span class="toc-number">2.2.1.</span> <span class="toc-text">嵌入式系统不等于单片机系统</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#学习方法上的不同"><span class="toc-number">2.2.2.</span> <span class="toc-text">学习方法上的不同</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#嵌入式系统不等于PC机"><span class="toc-number">2.2.3.</span> <span class="toc-text">嵌入式系统不等于PC机</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#实时操作系统"><span class="toc-number">2.3.</span> <span class="toc-text">实时操作系统</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#实时操作系统定义"><span class="toc-number">2.3.1.</span> <span class="toc-text">实时操作系统定义</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#实时系统衡量指标"><span class="toc-number">2.3.2.</span> <span class="toc-text">实时系统衡量指标</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#实时性"><span class="toc-number">2.3.2.1.</span> <span class="toc-text">实时性</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#优缺点"><span class="toc-number">2.3.2.2.</span> <span class="toc-text">优缺点</span></a></li></ol></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#嵌入式的特征"><span class="toc-number">2.4.</span> <span class="toc-text">嵌入式的特征</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#发展历程"><span class="toc-number">2.5.</span> <span class="toc-text">发展历程</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#分类"><span class="toc-number">2.6.</span> <span class="toc-text">分类</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#第二章-操作系统"><span class="toc-number">3.</span> <span class="toc-text">第二章 操作系统</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#存在的问题"><span class="toc-number">3.1.</span> <span class="toc-text">存在的问题</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#计算机操作系统"><span class="toc-number">3.2.</span> <span class="toc-text">计算机操作系统</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#计算机操作系统的作用"><span class="toc-number">3.2.1.</span> <span class="toc-text">计算机操作系统的作用</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#操作系统的功能"><span class="toc-number">3.2.2.</span> <span class="toc-text">操作系统的功能</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#操作系统中经常使用的数据结构"><span class="toc-number">3.2.3.</span> <span class="toc-text">操作系统中经常使用的数据结构</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#数组"><span class="toc-number">3.2.3.1.</span> <span class="toc-text">数组</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#位图"><span class="toc-number">3.2.3.2.</span> <span class="toc-text">位图</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#结构体"><span class="toc-number">3.2.3.3.</span> <span class="toc-text">结构体</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#链表"><span class="toc-number">3.2.3.4.</span> <span class="toc-text">链表</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#队列"><span class="toc-number">3.2.3.5.</span> <span class="toc-text">队列</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#堆栈"><span class="toc-number">3.2.3.6.</span> <span class="toc-text">堆栈</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#什么是多任务操作系统"><span class="toc-number">3.2.4.</span> <span class="toc-text">什么是多任务操作系统</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#程序的切换"><span class="toc-number">3.2.4.1.</span> <span class="toc-text">程序的切换</span></a></li></ol></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#嵌入式操作系统"><span class="toc-number">3.3.</span> <span class="toc-text">嵌入式操作系统</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#概述"><span class="toc-number">3.3.1.</span> <span class="toc-text">概述</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#嵌入式系统的基本结构"><span class="toc-number">3.3.1.1.</span> <span class="toc-text">嵌入式系统的基本结构</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#嵌入式系统硬件组成"><span class="toc-number">3.3.1.2.</span> <span class="toc-text">嵌入式系统硬件组成</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#嵌入式系统软件组成"><span class="toc-number">3.3.1.3.</span> <span class="toc-text">嵌入式系统软件组成</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#实时操作系统的特点"><span class="toc-number">3.3.1.4.</span> <span class="toc-text">实时操作系统的特点</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#基本概念"><span class="toc-number">3.3.2.</span> <span class="toc-text">基本概念</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#前后台系统"><span class="toc-number">3.3.2.1.</span> <span class="toc-text">前后台系统</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#操作系统"><span class="toc-number">3.3.2.2.</span> <span class="toc-text">操作系统</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#实时操作系统-2"><span class="toc-number">3.3.2.3.</span> <span class="toc-text">实时操作系统</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#代码临界区"><span class="toc-number">3.3.2.4.</span> <span class="toc-text">代码临界区</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#资源"><span class="toc-number">3.3.2.5.</span> <span class="toc-text">资源</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#共享资源"><span class="toc-number">3.3.2.6.</span> <span class="toc-text">共享资源</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#任务"><span class="toc-number">3.3.2.7.</span> <span class="toc-text">任务</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#任务切换"><span class="toc-number">3.3.2.8.</span> <span class="toc-text">任务切换</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#内核"><span class="toc-number">3.3.2.9.</span> <span class="toc-text">内核</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#调度"><span class="toc-number">3.3.2.10.</span> <span class="toc-text">调度</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#非占先式内核"><span class="toc-number">3.3.2.11.</span> <span class="toc-text">非占先式内核</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#占先式内核"><span class="toc-number">3.3.2.12.</span> <span class="toc-text">占先式内核</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#任务优先级"><span class="toc-number">3.3.2.13.</span> <span class="toc-text">任务优先级</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#中断"><span class="toc-number">3.3.2.14.</span> <span class="toc-text">中断</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#时钟节拍"><span class="toc-number">3.3.2.15.</span> <span class="toc-text">时钟节拍</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#使用实时操作系统的必要性"><span class="toc-number">3.3.3.</span> <span class="toc-text">使用实时操作系统的必要性</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#实时操作系统的优缺点"><span class="toc-number">3.3.4.</span> <span class="toc-text">实时操作系统的优缺点</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#常见的嵌入式操作系统"><span class="toc-number">3.3.5.</span> <span class="toc-text">常见的嵌入式操作系统</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#嵌入式Linux"><span class="toc-number">3.3.5.1.</span> <span class="toc-text">嵌入式Linux</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#WinCE"><span class="toc-number">3.3.5.2.</span> <span class="toc-text">WinCE</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#VxWorks"><span class="toc-number">3.3.5.3.</span> <span class="toc-text">VxWorks</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#OSE"><span class="toc-number">3.3.5.4.</span> <span class="toc-text">OSE</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#Nucleus"><span class="toc-number">3.3.5.5.</span> <span class="toc-text">Nucleus</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#eCos"><span class="toc-number">3.3.5.6.</span> <span class="toc-text">eCos</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#μC-OS-II"><span class="toc-number">3.3.5.7.</span> <span class="toc-text">μC&#x2F;OS-II</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#Android"><span class="toc-number">3.3.5.8.</span> <span class="toc-text">Android</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#iOS"><span class="toc-number">3.3.5.9.</span> <span class="toc-text">iOS</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#ulTRON"><span class="toc-number">3.3.5.10.</span> <span class="toc-text">ulTRON</span></a></li></ol></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#GNU计划"><span class="toc-number">3.4.</span> <span class="toc-text">GNU计划</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#μC-OS-II微小内核分析"><span class="toc-number">4.</span> <span class="toc-text">μC&#x2F;OS-II微小内核分析</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#概述-2"><span class="toc-number">4.1.</span> <span class="toc-text">概述</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#μC-OS-II微小内核简介"><span class="toc-number">4.1.1.</span> <span class="toc-text">μC&#x2F;OS-II微小内核简介</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#内核代码"><span class="toc-number">4.1.2.</span> <span class="toc-text">内核代码</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#移植代码"><span class="toc-number">4.1.3.</span> <span class="toc-text">移植代码</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#配置文件"><span class="toc-number">4.1.4.</span> <span class="toc-text">配置文件</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#函数说明"><span class="toc-number">4.1.5.</span> <span class="toc-text">函数说明</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#OSInit"><span class="toc-number">4.1.5.1.</span> <span class="toc-text">OSInit</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#OSStart"><span class="toc-number">4.1.5.2.</span> <span class="toc-text">OSStart</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#OSTimeDly"><span class="toc-number">4.1.5.3.</span> <span class="toc-text">OSTimeDly</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#OSTimeTick"><span class="toc-number">4.1.5.4.</span> <span class="toc-text">OSTimeTick</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#OSTaskDel"><span class="toc-number">4.1.5.5.</span> <span class="toc-text">OSTaskDel</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#OSIntEnter"><span class="toc-number">4.1.5.6.</span> <span class="toc-text">OSIntEnter</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#OSIntExit"><span class="toc-number">4.1.5.7.</span> <span class="toc-text">OSIntExit</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#禁止-允许中断函数"><span class="toc-number">4.1.5.8.</span> <span class="toc-text">禁止&#x2F;允许中断函数</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#OSSemCreate"><span class="toc-number">4.1.5.9.</span> <span class="toc-text">OSSemCreate</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#OSSemPend"><span class="toc-number">4.1.5.10.</span> <span class="toc-text">OSSemPend</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#OSSemPost"><span class="toc-number">4.1.5.11.</span> <span class="toc-text">OSSemPost</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#OSSemDel"><span class="toc-number">4.1.5.12.</span> <span class="toc-text">OSSemDel</span></a></li></ol></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#最小内核"><span class="toc-number">4.2.</span> <span class="toc-text">最小内核</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#什么是任务"><span class="toc-number">4.2.0.1.</span> <span class="toc-text">什么是任务</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#独立"><span class="toc-number">4.2.0.2.</span> <span class="toc-text">独立</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#任务控制快"><span class="toc-number">4.2.0.3.</span> <span class="toc-text">任务控制快</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#任务就绪算法"><span class="toc-number">4.2.0.4.</span> <span class="toc-text">任务就绪算法</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#OS初始化"><span class="toc-number">4.2.0.5.</span> <span class="toc-text">OS初始化</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#任务管理"><span class="toc-number">4.2.0.6.</span> <span class="toc-text">任务管理</span></a></li></ol></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#临界区与中断管理"><span class="toc-number">4.3.</span> <span class="toc-text">临界区与中断管理</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#任务的结束"><span class="toc-number">4.4.</span> <span class="toc-text">任务的结束</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#信号量"><span class="toc-number">4.5.</span> <span class="toc-text">信号量</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#删除信号量"><span class="toc-number">4.6.</span> <span class="toc-text">删除信号量</span></a></li></ol></li></ol>
        </nav>
    </div>
</aside>





        </section>
        <footer class="hidden lg:block fixed bottom-0 left-0 sm:w-1/12 lg:w-1/6 bg-gray-100 z-40">
    
    <div class="footer-social-links">
        
            <a href="https://github.com/happylzyy" target="_blank" rel="noopener">
                <i class="iconfont icon-github"></i>
            </a>
        
            <a href="https://twitter.com/hulgodhel" target="_blank" rel="noopener">
                <i class="iconfont icon-twitter"></i>
            </a>
        
    </div>
    
    
</footer>

        <div id="mask" class="hidden mask fixed inset-0 bg-gray-900 opacity-75 z-40"></div>
        <div id="search-view-container" class="hidden shadow-xl"></div>
        
<script src="/js/dom-event.min.js"></script>

<script src="//cdn.jsdelivr.net/npm/yox@1.0.0-alpha.121/dist/standard/prod/yox.min.js"></script>


<script src="/js/search.min.js"></script>


    <script src="//cdn.jsdelivr.net/npm/gitalk@1.5.2/dist/gitalk.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/blueimp-md5@2.10.0/js/md5.min.js"></script>
<script type="text/javascript">
    var gitalk = new Gitalk({
        clientID: '595d6049487da2d9c45b',
        clientSecret: '6a59a1d4a49d8b5960e9de716cf905f31b2ebe0d',
        repo: 'happylzyy.github.io',
        owner: 'happylzyy',
        admin: ['happylzyy'],
        id: md5(location.pathname),
        distractionFreeMode: true
    })
    gitalk.render('comments')
</script>



    <script src="//cdn.jsdelivr.net/npm/lightgallery.js@1.1.3/dist/js/lightgallery.min.js"></script>
    
<script src="/js/light-gallery.min.js"></script>





    </body>
</html>
